package com.lpf.nio;

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

/**
 * 功能描述：字符集
 *
 * @author lpf
 * @date 2019/11/27 16:34
 * @version: 1.0
 **/
public class NioTest13 {

    public static void main(String[] arg) throws Exception {

        String inputFile = "C:\\Users\\LIUPEIFENG\\IdeaProjects\\Netty-Learning\\netty-zhanglong\\src\\main\\java\\com\\lpf\\nio\\text\\NioTest13_in.txt";
        String outputFile = "C:\\Users\\LIUPEIFENG\\IdeaProjects\\Netty-Learning\\netty-zhanglong\\src\\main\\java\\com\\lpf\\nio\\text\\NioTest13_out.txt";

        RandomAccessFile inputAccessFile = new RandomAccessFile(inputFile, "r");
        RandomAccessFile outputAccessFile = new RandomAccessFile(outputFile, "rw");

        // 获取输入文件长度
        long inputLength = new File(inputFile).length();

        // 获取文件输入输出通道
        FileChannel inputChannel = inputAccessFile.getChannel();
        FileChannel outputChannel = outputAccessFile.getChannel();

        // 获取内存映射文件
        MappedByteBuffer inputData = inputChannel.map(FileChannel.MapMode.READ_ONLY, 0, inputLength);

        System.out.println("==============");

        Charset.availableCharsets().forEach((k, v) -> {
            System.out.println(k + ":" + v);
        });

        System.out.println("==============");

        Charset charset = Charset.forName("iso-8859-1"); // 中文也能正常输出（并不管内容是什么，原封不动的输出到另一个文件，所以不会乱码）
        //Charset charset = Charset.forName("utf-8");// 字符集对象，代表着一种编码
        // 获取编解码器
        CharsetEncoder charsetEncoder = charset.newEncoder();// 编码器，字符串变成字节数组
        CharsetDecoder charsetDecoder = charset.newDecoder();// 解码器，字节数组变成字符串


        CharBuffer charBuffer = charsetDecoder.decode(inputData);// 解码

        //System.out.println(charBuffer.length());
        //System.out.println(charBuffer.get(10));  // 中文在iso-8859-1下中间这个过程肯定是乱码的（见下面的分析）

        //ByteBuffer outputData = Charset.forName("utf-8").encode(charBuffer);
        ByteBuffer outputData = charsetEncoder.encode(charBuffer);// 编码

        outputChannel.write(outputData);

        inputAccessFile.close();
        outputAccessFile.close();

        /**
         * “nihaohello你好”，占用16个字节
         *
         * “你”占用第11到13位字节（索引为10到12）（UTF8下汉字使用三个字节表示）
         *
         *  在控制台打印第11位（索引10），即表示“你”的三个字节的第一个字节。
         *
         *
         * 在Windows上回车占两个字节，在Mac上回车占一个字节
         **/




    }
}
